package com.tree.leetcode.array;

import cn.hutool.json.JSONUtil;
import com.tree.array.ArrayList;

import java.util.List;

import static cn.hutool.core.util.ArrayUtil.swap;

/**
 * @ClassName com.tree.leetcode.array
 * Description: 442. 数组中重复的数据
给你一个长度为 n 的整数数组 nums ，其中 nums 的所有整数都在范围 [1, n] 内，且每个整数出现 一次 或 两次 。请你找出所有出现 两次 的整数，并以数组形式返回。
你必须设计并实现一个时间复杂度为 O(n) 且仅使用常量额外空间的算法解决此问题。
示例 1：
输入：nums = [4,3,2,7,8,2,3,1]
输出：[2,3]
示例 2：

输入：nums = [1,1,2]
输出：[1]
示例 3：

输入：nums = [1]
输出：[]
 * @Author frankzsliu
 * @Date 2024/3/15 11:18
 * @Version 1.0
 */
public class FindDuplicates_442 {

    public static void main(String[] args) {
        int[] nums = {4,3,2,7,8,2,3,1};
        System.out.println(JSONUtil.toJsonStr(findDuplicates(nums)));
    }

    public static List<Integer> findDuplicates(int[] nums){
        int n = nums.length;

        //i = nums[i] /, 即nums[i] = nums[nums[i]]
        List<Integer> ret = new ArrayList();
        for(int i =0 ;i< n; i++){
            while (nums[i] != nums[nums[i] - 1]) {
                swap(nums, i, nums[i] - 1);
                System.out.println(JSONUtil.toJsonStr(nums));
            }
//            System.out.println(JSONUtil.toJsonStr(nums));
//            while (i != (nums[i]-1)) {
//
//                if (nums[i] == nums[nums[i]-1]) {
//                    ret.add(nums[i]);
//                    continue;
//                }
//                int tmp = nums[nums[i]-1];
//                nums[nums[i]-1] = nums[i];
//                nums[i] = tmp;
//                System.out.println("i="+i+", nums="+JSONUtil.toJsonStr(nums));
//            }
        }

        List<Integer> ans = new ArrayList<Integer>();
        for (int i = 0; i < n; ++i) {
            if (nums[i] - 1 != i) {
                ans.add(nums[i]);
            }
        }

        return ans;
    }
}
